// $Revision: 17276 $

function Wormhole() {
	this.whCharSet="UTF-8";
	this.whUrl="/wh";
	this.whOnError;
	this.whProxy;
	this.whDebug=false;
	
	var contentType="application/json;charset="+this.whCharSet;
	var quotes={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};
		
	var createXMLHttpRequest=function() {
		if(typeof XMLHttpRequest!='undefined') {
	    	return new XMLHttpRequest();
		} else {
	    	try {
	        	return new ActiveXObject("Msxml2.XMLHTTP");
	    	} catch(e) {
	        	try {
	            	return new ActiveXObject("Microsoft.XMLHTTP");
	        	} catch(e) {
	            	return null;
	        	}
	    	}
	    }
	    return null;
	}
	
	var req=createXMLHttpRequest();
	
	var callback;
	
	var quote=function(whs) {
		t=whs+'';r="";
		for(i=0;i<t.length;i++){
			c=t.charAt(i);
			if(quotes[c]){r+=quotes[c];}else{r+=c;}
		}
		return r;	  
	}

	var getCommand=function(id,method,args,attrs) {
		whs='{"id":"'+quote(id)+'","method":"'+quote(method)+'","args":['; 
		if(args){
			for(j=0;j<args.length;j++){whs+='"'+quote(args[j]+'')+'",';}
			if(args.length>0){
				whs=whs.substr(0,whs.length-1);
			}
		}
		whs+=']';
		if(attrs){whs+=',"attrs":'+attrs;}
		whs+='}';
		return whs;
	}

	var whError=function(m, fn) {
		
		if(typeof fn == 'function'){  fn(m);}
		
	}

	this.whS=function(id,method,args,attrs) {
		try {
			url=this.whUrl;
			if(typeof this.whProxy != 'undefined') {
				url+="?p=" + this.whProxy;
			}
			req.open("POST",url,false);
			req.setRequestHeader('Content-Type',contentType);
			if(req.overrideMimeType){req.overrideMimeType(contentType);}	
			jsonString=getCommand(id,method,args,attrs);
			req.send(jsonString);
			if(req.status==501){whError("Lost Wormhole:" + jsonString);}
			if(req.status==503){  whError("WhController not available:" + jsonString,this.whOnError );}			
			if(req.status==200){ 
				json=req.responseText;
				try {	
					result = eval("("+json+")");
				} catch(e) {
					result = json;
				}
				return result;
			}
			return null;
		}
		catch(e){
			//alert('rrr rxp ' + e);
		}
		finally {
			req=null;
		}
	}

	this.whA=function(xm,id,method,args) {
		try {
			callback=xm;
			req.onreadystatechange=this.whCb;
			url=this.whUrl;
			if(typeof this.whProxy != 'undefined') {
				url+="?p=" + this.whProxy;
			}
			req.open("POST",url,true);
			req.setRequestHeader('Content-Type',contentType);
			if(req.overrideMimeType){req.overrideMimeType(contentType);}	
			jsonString=getCommand(id,method,args);
			req.send(jsonString);
		} catch(e) {
			req=null;
		}
		return null;
	}

	this.whCb=function(){
		try {
			if(req.readyState==4){
				if(req.status==501){whError("Lost Wormhole");}
				if(req.status==503){whError("WhController not available");}
				if(req.status==200){
					try{
						json=req.responseText;
						if(callback!=null) {
							try {
								result = eval("("+json+")");
							} catch(e) {
								result = json;
							}
							callback(result);
						}
					}catch(e){}
				} 
				req=null;
				callback=null;
			}
		}
		catch(e){}
	}
	
	var createRequest=function(theForm) {
		var qs = '{'
		for (e=0;e<theForm.elements.length;e++) {
			var fe=theForm.elements[e];
			if(fe.type!='submit' && fe.type!='button' && fe.type!='file') {
				fieldValue = getFieldValue(fe);
				if(fieldValue != null) {
					qs+='"'+theForm.elements[e].name+'":"'+quote(getFieldValue(theForm.elements[e]))+'",';
				}
			}
		}
		if(qs.length>1){qs=qs.substr(0,qs.length-1);}
		qs+='}';
		return qs
	}

	var getFieldValue=function(obj) {
		switch(obj.type){
			case 'radio': case 'checkbox': return obj.checked?obj.value:null;
			case 'text': case 'hidden': case 'textarea': return obj.value;
			case 'password': return obj.value;
			case 'select-one':
				if(obj.options==null || obj.selectedIndex<0 || obj.options.length<=0) {
					return null;
				}
				if(obj.options[obj.selectedIndex].value != null && obj.options[obj.selectedIndex].value != '') {
					return obj.options[obj.selectedIndex].value;
				} else {
					return obj.options[obj.selectedIndex].text;
				}
			case 'select-multiple': 
				if (obj.options==null) { return null; }
				var values=new Array();
				for(var i=0;i<obj.options.length;i++) {
					if(obj.options[i].selected) {
						if(obj.options[i].value != null && obj.options[i].value != '') {
							values[values.length]=obj.options[i].value;
						} else {
							values[values.length]=obj.options[i].text;
						}
					}
				}
				return values;
		}
		return null;
	}

	this.validateForm=function(theForm) {
		var errors = this.whS(theForm.name, "validate", null, createRequest(theForm));
		if(errors == null) {
			errors = new Array();
		}
		return errors;
	}
	this.validateFormRemote=function(theForm) {
		var errors = this.whS(theForm.name, "validate", null, createRequest(theForm));		
		return errors;
	}

} 

function validateForm(theForm, proxy,errorHandle) {	
	var wormhole = new Wormhole();
	wormhole.whProxy=proxy;
	wormhole.whOnError=errorHandle;
	return wormhole.validateForm(theForm);	
}

function resetErrorHeaders(){
var x=document.getElementsByTagName("div");
    for(aa in x){
        if(typeof x[aa].id == 'string')
            if(x[aa].id.indexOf("formerrors")!=-1)
                replaceClassName(document.getElementById(x[aa].id), 'errordisplayvisible', 'hidden');
    }
}

function validate(theForm, proxy, errorHandle) {
	var wormhole = new Wormhole();
	wormhole.whProxy=proxy;	
	wormhole.whOnError=errorHandle;	
	resetErrorHeaders();
	if('remote' == proxy ){
		var errors = wormhole.validateFormRemote(theForm);
	}
	else{	
		var errors = wormhole.validateForm(theForm);
	}	
	if(errors != null ){
		return showErrors(errors, theForm.name);
	}else{
		return false;
	}
	
}

function showErrors(errors, formName) {
	eval('var e0 = document.getElementById(\'formerrors'+formName+'\');');
	if(e0 != null) {
		if(errors.length > 0) {
			replaceClassName(e0, 'hidden', 'errordisplayvisible');
		} else {
			replaceClassName(e0, 'errordisplayvisible', 'hidden');	
		}
	}
	for (var errorId in formError) {
		var e1 = document.getElementById(errorId);
		if(e1 != null) {
			replaceClassName(e1, 'errordisplayvisible', 'hidden');
		} 
		var e2 = document.getElementById("sum_" + errorId);
		if(e2 != null) {
			replaceClassName(e2, 'errordisplayvisible', 'hidden');
		} 
		var e3 = document.getElementById('iconError_' + formError[errorId][0]);
		if(e3 != null) {
		 	e3.className='hidden';
			sliceClassName(e3.parentNode, 'error');
		} 
	}
	for(i=0; i<errors.length; i++) {
		var e4 = document.getElementById(errors[i]);
		if(e4 != null) {
			replaceClassName(e4, 'hidden', 'errordisplayvisible');
		} 
		var e5 = document.getElementById("sum_" + errors[i]);
		if(e5 != null) {
			replaceClassName(e5, 'hidden', 'errordisplayvisible');
		} 
		var e6 = document.getElementById('iconError_' + formError[errors[i]][0]);
		if(e6 != null) {
			e6.className='errorimgvisible';
			appendClassName(e6.parentNode, 'error');
		} 
	}
	if(typeof WINSZ=='function')WINSZ();
	return (errors.length == 0);
}